#include "graph.h"
//#pragma GCC optimize(3)
//#pragma GCC optimize("Ofast,unroll-loops")
#include<bits/stdc++.h>
#define ll long long
//#define int long long
#define ull unsigned long long
#define lll __int128
#define fi first
#define se second
//#define double long double
using namespace std;
const long long INF=1e9+5;
const long long mod=998244353,orm=3;
//const long long mod=1000000007;
const int MAXN=1005;
const double eps=1e-6;
vector<pair<int,int> > v[MAXN];
vector<int> mp[MAXN];
int n;
int vst[MAXN],prt[MAXN],rd[MAXN],ans[MAXN],pre[MAXN];
int f[505][505];
void init(int s) {
	rd[s]=NumberOfRoads();
	mp[s].push_back(0);
	for(int i=1;i<=rd[s];i++) mp[s].push_back(0);
}
mt19937 rnd(unsigned(time(0)));
void dfs(int s,int fa) {
	init(s);prt[s]=fa;
	int lst=0;
	if(fa) {
		lst=LastRoad();
		pre[s]=lst;
		mp[s][lst]=fa;
	}
	vector<int> t;
	for(int i=1;i<=rd[s];i++) {
		if(!mp[s][i]) t.push_back(i);
	}
	shuffle(t.begin(),t.end(),rnd);
	for(int i:t) {
		if(!mp[s][i]) {
			Move(i,2);
			int now=Color();
			if(now==1) v[s].push_back({i,++n}),mp[s][i]=n,dfs(n,s);
			else {
				int lst2=LastRoad();
				Move(lst2,2);
			}
		}
	}
	if(fa) {
		Move(lst,2);
	}
}
void dfs2(int s,int fa) {
	int lst=0;
	if(fa) {
		lst=LastRoad();
	}
	vector<int> t;
	for(int i=1;i<=rd[s];i++) {
		if(!mp[s][i]) t.push_back(i);
	}
	shuffle(t.begin(),t.end(),rnd);
	for(int i:t) {
		if(!mp[s][i]) {
			Move(i,3);
			int now=Color();
			if(now==3) {
				int lst2=LastRoad();
				
				Move(lst2,1);
				int x=s;
				while(1) {
					int now2=Color();
					if(now2==1) {
						Move(lst2,3);break;
					}
					Move(pre[x],3);x=prt[x];
				}
				mp[s][i]=x;mp[x][lst2]=s;
			}
			else {
				int lst2=LastRoad();
				Move(lst2,2);
			}
		}
	}
	for(auto y:v[s]) Move(y.fi,3),dfs2(y.se,s);
	if(fa) {
		Move(lst,2);
	}
}
void Inspect(int R) {
	n=1;
	dfs(1,0);
	dfs2(1,0);
	for(int i=0;i<=n;i++) {
		for(int j=0;j<=n;j++) f[i][j]=INF;
		f[i][i]=0;
	}
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=rd[i];j++) {
			if(!mp[i][j]) assert(0);
			else f[i][mp[i][j]]=1;
		}
	}
	for(int k=1;k<=n;k++) {
		for(int i=1;i<=n;i++) {
			for(int j=1;j<=n;j++) f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
		}
	}
	for(int i=1;i<=n;i++) {
		for(int j=i+1;j<=n;j++) ans[f[i][j]]++;
	}
	for(int i=1;i<=R;i++) Answer(i,ans[i]);
}
